package com.zmn.mcc.dubbo.interfaces.dept;

import com.zmn.common.dto.VtDTO;
import com.zmn.common.dto2.ResponseDTO;
import com.zmn.mcc.common.dto.dept.BsDeptDIO;
import com.zmn.mcc.common.dto.dept.BsDeptDRO;
import com.zmn.mcc.common.dto.dept.DeptDRO;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * @author heguanghua
 * @since 2020/07/03 12:08
 */
public interface DeptListRemoteService {

    /**
     * 取得指定部门信息对象
     *
     * @param deptId 部门ID
     * @return
     */
    ResponseDTO<DeptDRO> getDept(Integer deptId);

    /**
     * 取得指定部门顶级部门信息对象
     *
     * @param deptId
     * @return
     */
    ResponseDTO<DeptDRO> getRootDept(Integer deptId);

    /**
     * 描述: 根据父级id和关键字查询部门列表（有效）
     *
     * @param deptId  部门ID（本级和所有下级，需递归）
     * @param keyWord 部门id或名称（模糊查询）
     * @author guoqiao
     * @since 2021/5/20 10:44
     */
    ResponseDTO<List<DeptDRO>> listDeptByIdAndKeyWord(Integer deptId, String keyWord);

    /**
     * 根据部门ID集合查询部门列表
     *
     * @return
     */
    ResponseDTO<List<DeptDRO>> listDeptByDeptIds(List<Integer> deptIds);

    /**
     * 根据状态和层级查询部门列表
     *
     * @param status 状态 可为空
     * @param level  层级  可为空
     * @return
     */
    ResponseDTO<List<DeptDRO>> listDeptByLevelAndStatus(Integer level, Integer status);

    /**
     * 取得指定组织架构下的部门列表
     *
     * @param orgId  组织架构ID
     * @param status 部门启用/停用状态
     * @return
     */
    ResponseDTO<List<VtDTO>> listDeptVtByOrgId(Integer orgId, Integer status);

    /**
     * 取得指定组织架构下的部门列表
     *
     * @param orgId  组织架构ID
     * @param status 部门启用/停用状态
     * @return
     */
    ResponseDTO<List<DeptDRO>> listDeptByOrgId(Integer orgId, Integer status);

    /**
     * 根据orgIds取得指定组织架构下的部门列表
     *
     * @param orgIds
     * @param status
     * @return
     */
    ResponseDTO<List<DeptDRO>> listDeptByOrgIds(List<Integer> orgIds, Integer status);

    /**
     * 取得指定部门的下级部门Vt列表
     *
     * @param parentId 部门ID
     * @param status   部门启用/停用状态
     * @return
     */
    ResponseDTO<List<VtDTO>> listDeptVtByParentId(Integer parentId, Integer status);

    /**
     * 取得指定部门的下级部门列表
     *
     * @param parentId 部门ID
     * @param status   部门启用/停用状态
     * @return
     */
    ResponseDTO<List<DeptDRO>> listDeptByParentId(Integer parentId, Integer status);

    /**
     * 根据指定的组织id，父节点id集合，层级等条件查找对应的部门
     *
     * @param orgId
     * @param parentIdList
     * @param level
     * @param status
     * @return
     */
    ResponseDTO<List<DeptDRO>> listDeptByOrgIdAndParentIds(Integer orgId, List<Integer> parentIdList,
                                                           Integer level, Integer status);

    /**
     * 根据组织id列表、部门ID列表，查询部门ID列表下的所有子部门
     *
     * @param orgIds  组织id列表
     * @param deptIds 部门ID列表
     * @return 所有子部门id、名称、状态
     * @author xujie
     * @since 2021-05-17
     */
    @ApiOperation(value = "根据组织id列表、部门ID列表，查询部门ID列表下的所有子部门", notes = "子部门id、名称、状态", response = VtDTO.class)
    ResponseDTO<List<VtDTO>> listSubDeptVtByOrgIdsAndDeptIds(@ApiParam(value = "组织id列表", required = true)
                                                             @Size(message = "组织id列表", max = 500) List<Integer> orgIds,
                                                             @ApiParam(value = "部门ID列表", required = true)
                                                             @NotNull(message = "部门ID列表不能为空")
                                                             @Size(message = "部门ID列表", min = 1, max = 500) List<Integer> deptIds);


    /**
     * 根据北森部门ID查询部门信息
     *
     * @param bsDeptIds 北森部门ID列表
     * @return
     */
    ResponseDTO<List<BsDeptDRO>> listBsDeptByBsDeptId(List<Integer> bsDeptIds);

    /**
     * devops 使用此接口获取有效的啄木鸟的部门信息
     * @return
     */
    ResponseDTO<List<DeptDRO>> listValidZmnDept();

    /**
     * 北森系统部门信息更新
     *
     * @param list 北森部门信息列表
     * @return
     */
    ResponseDTO<String> saveBsDeptInfo(List<BsDeptDIO> list);
}
